home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / database / postgres / appgen-0.2-a / appgen-0 / AppGEN / src / tools / dbf2sql.c next >
Encoding:
C/C++ Source or Header  |  1996-07-10  |  3.0 KB  |  126 lines

  1. /* Copyright 1996 Andrew Whaley (andrew@arthur.smuht.nwest.nhs.uk */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6.  
  7. typedef struct dbf_header {
  8.     char version;
  9.     char year;
  10.     char month;
  11.     char day;
  12.     int records;
  13.     unsigned char header_length_l;
  14.     unsigned char header_length_h;
  15.     unsigned char record_length_l;
  16.     unsigned char record_length_h;
  17.     char reserved[20];
  18.     } dbf_header; 
  19.  
  20. typedef struct field_descriptor {
  21.     char name[11]; 
  22.     char type; 
  23.     int  address;
  24.     unsigned char length;
  25.     char decs;
  26.     char reserved[14];
  27.     } field_descriptor;
  28.  
  29. char *lower(char[]);
  30. char *clean(char[]);
  31. char *fnumber(char[]);
  32.  
  33. void main(int argc, char *argv[])
  34. {
  35.  
  36.     FILE *dbf;
  37.     int a,b;
  38.     char buffer[256];
  39.     unsigned int fields;
  40.     dbf_header header;
  41.     field_descriptor field[256];
  42.     char table[16];
  43.  
  44.     if (argc!=2) {
  45.         printf("Usage: dbf2sql <filename.dbf>\n\n");
  46.         printf("dbf2sql Converts DBase III compatible DBF files to an \n");
  47.         printf("SQL script consisting of a CREATE TABLE clause and INSERT \n");
  48.         printf("clauses for each record in the DBF file.\n");
  49.         printf("(c) 1996, Andrew Whaley (andrew@arthur.smuht.nwest.nhs.uk)\n");
  50.         exit(1);
  51.          }
  52.  
  53.     dbf=fopen(argv[1],"rb");
  54.     if (dbf==NULL) {
  55.         fprintf(stderr,"Can't open %s.\n",argv[1]);
  56.         exit(1);
  57.         }
  58.     
  59.     fread(&header,sizeof(header),1,dbf);
  60.     fields=(((header.header_length_h * 256)+header.header_length_l)/32)-1;    
  61.     fread(&field,32,fields,dbf);
  62.     strcpy(table,argv[1]);
  63.             for (a=0; ((a<16) && (a<strlen(argv[1]))); a++) {
  64.         if (table[a]=='.') table[a]=NULL;
  65.         }
  66.     printf("CREATE TABLE %s (\n",table);
  67.     for (a=0; a<fields; a++) {
  68.         printf("    %s ",lower(field[a].name));
  69.         if (field[a].type=='C') printf("char(%d)",field[a].length);
  70.         if ((field[a].type=='N') && (field[a].decs==0)) printf("int");
  71.         if ((field[a].type=='N') && (field[a].decs>0)) printf("float");
  72.         if (field[a].type=='D') printf("date");
  73.         if (field[a].type=='L') printf("char");
  74.         if (field[a].type=='M') printf("char(10)");
  75.         if (a==fields-1) printf(" );\n\n");
  76.         else printf(",\n");
  77.         }
  78.     fgetc(dbf);
  79.     for(a=0; a<header.records; a++) {
  80.         printf("INSERT INTO %s VALUES (",table);
  81.         fgetc(dbf);
  82.         for (b=0; b<fields; b++) {
  83.             fgets(buffer, field[b].length+1, dbf);
  84.             if (field[b].type=='D') {
  85.                 if ((strlen(buffer)==8)&&(buffer[0]!=' '))  printf("'%c%c-%c%c-%c%c%c%c'",buffer[6],buffer[7],buffer[4],buffer[5],buffer[0],buffer[1],buffer[2],buffer[3]);
  86.                 else printf("'01-01-1980'");
  87.                 }
  88.             else if (field[b].type=='N') printf("%s",fnumber(buffer));
  89.             else printf("'%s'",clean(buffer));
  90.             if (b==fields-1) printf(");\n");
  91.             else printf(",");
  92.             }
  93.         }
  94.  
  95.     fclose(dbf);
  96. }
  97.  
  98.  
  99. char *lower(char input[])
  100. {
  101.     int a;
  102.     for (a=0; a<strlen(input); a++) {
  103.         if ((input[a]>='A') && (input[a]<='Z')) input[a]+='a'-'A';
  104.         }
  105.     return(input);
  106. }
  107.  
  108. char *clean(char input[])
  109. {
  110.     int a;
  111.     for (a=0; a<strlen(input); a++) {
  112.         if ((input[a]=='\'') || (input[a]=='\"')) input[a]=' ';
  113.         }
  114.     return(input);
  115. }
  116.  
  117. char *fnumber(char input[])
  118. {
  119.     int a,f=0;
  120.     for (a=0; a<strlen(input); a++) {
  121.         if ((input[a]>='0')&&(input[a]<='9')) f=1;
  122.         }
  123.     if (f==1) return(input);
  124.     else return(" 0");
  125. }
  126.